home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / xwindows / demos / xfract_1.z / xfract_1 / xfractint-1.06 / encoder.c < prev    next >
C/C++ Source or Header  |  1992-09-28  |  27KB  |  839 lines

  1. /*
  2.     encoder.c - GIF Encoder and associated routines
  3.     This module is linked as an overlay, use ENTER_OVLY and EXIT_OVLY.
  4. */
  5.  
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #ifndef XFRACT
  10. #include <io.h>
  11. #endif
  12. #include "fractint.h"
  13. #include "fractype.h"
  14. #include "prototyp.h"
  15.  
  16. /* MCP 10-27-91 */
  17. #ifdef WINFRACT
  18.    extern int OperCancelled;
  19.    void OpenStatusBox(void);
  20.    void UpdateStatusBox(unsigned long Partial, unsigned long Total);
  21.    void CloseStatusBox(void);
  22. #endif
  23.  
  24. extern char s_cantopen[];
  25. extern char s_cantwrite[];
  26. extern char s_cantcreate[];
  27. extern char s_cantunderstand[];
  28. extern char s_cantfind[];
  29.  
  30. static void _fastcall setup_save_info(struct fractal_info *);
  31. static int inittable(void);
  32. static int _fastcall shftwrite(BYTE *color,int numcolors);
  33. static int _fastcall raster(unsigned int);
  34. static int  _fastcall extend_blk_len(int datalen);
  35. static int _fastcall put_extend_blk(int block_id,int block_len,char far *block_data);
  36. static int  _fastcall store_item_name(char *);
  37.  
  38. extern int initbatch;
  39. extern char far *resume_info;        /* pointer to resume info if allocated */
  40. extern int  resume_len;         /* length of resume info */
  41. extern char LName[];
  42. extern char FormName[];         /* formula name */
  43. extern char IFSName[];
  44. extern int  active_system;        /* 0=dos, 1=windows */
  45. extern int  far *ranges;
  46. extern int  rangeslen;
  47.  
  48. extern    int    sxdots,sydots;        /* # of dots on the physical screen    */
  49. extern    int    sxoffs,syoffs;        /* physical top left of logical screen */
  50. extern    int    xdots, ydots;        /* # of dots on the logical screen     */
  51. extern    int    viewwindow;        /* 0 for full screen, 1 for window */
  52. extern    float    finalaspectratio;    /* for view shape and rotation */
  53. extern    int    viewxdots,viewydots;    /* explicit view sizing */
  54. extern    int    colors;         /* maximum colors available */
  55. extern    int    dotmode;        /* so we can detect disk-video */
  56. extern    char overwrite;         /* overwrite on/off */
  57. extern    int    resave_flag;        /* resaving after a timed save */
  58. extern    int    started_resaves;
  59. extern    int    timedsave;        /* if doing an auto save */
  60. extern    int    disk16bit;        /* 16 bit continuous potential */
  61.  
  62. extern BYTE dacbox[256][3];    /* Video-DAC (filled in by SETVIDEO) */
  63. extern    int    gotrealdac;        /* DAC valid? */
  64. extern int    daclearn, daccount;    /* used by the color-cyclers */
  65. extern int    extraseg;        /* used by Save-to-GIF routines */
  66. extern int    debugflag;
  67.  
  68. extern int    gif87a_flag;        /* if 1, supress GIF extension blocks */
  69.  
  70. extern int    calc_status;
  71. extern long   calctime;
  72. extern char   stdcalcmode;
  73. extern int    fractype;
  74. extern double xxmin,xxmax;
  75. extern double yymin,yymax;
  76. extern double xx3rd,yy3rd;
  77. extern double param[4];
  78. extern int    maxit;            /* try this many iterations */
  79. extern int    fillcolor;        /* fill color: -1 = normal  */
  80. extern int    inside;            /* inside color: 1=blue     */
  81. extern int    outside;            /* outside color, if set    */
  82. extern int    finattract;        /* finite attractor option  */
  83. extern int    forcesymmetry;
  84. extern int    LogFlag;            /* non-zero if logarithmic palettes */
  85. extern int    rflag, rseed;
  86. extern int    periodicitycheck;
  87. extern char   useinitorbit;
  88. extern struct complex initorbit;
  89. extern int    pot16bit;
  90. extern float  finalaspectratio;
  91. extern double potparam[3];        /* three potential parameters*/
  92. extern double inversion[];
  93. extern int    decomp[];
  94. extern int    distest;            /* non-zero if distance estimator   */
  95. extern int    distestwidth;
  96. extern int    init3d[20];        /* '3d=nn/nn/nn/...' values */
  97. extern char   floatflag;        /* floating-point fractals? */
  98. extern int    usr_biomorph;
  99. extern int    bailout;            /* user input bailout value */
  100. extern int    previewfactor;
  101. extern int    xtrans;
  102. extern int    ytrans;
  103. extern int    red_crop_left;
  104. extern int    red_crop_right;
  105. extern int    blue_crop_left;
  106. extern int    blue_crop_right;
  107. extern int    red_bright;
  108. extern int    blue_bright;
  109. extern int    xadjust;
  110. extern int    eyeseparation;
  111. extern int    glassestype;
  112. extern int    save_system;
  113. extern int    save_release;
  114. extern int    display3d;        /* 3D display flag: 0 = OFF */
  115. extern int    Ambient;
  116. extern int    RANDOMIZE;
  117. extern int    haze;
  118. extern int    transparent[2];
  119. extern int    rotate_lo,rotate_hi;
  120. extern char   busy;
  121.  
  122. #ifdef XFRACT
  123. extern int decode_fractal_info();
  124. #endif
  125.  
  126. /*
  127.             Save-To-Disk Routines (GIF)
  128.  
  129. GIF and 'Graphics Interchange Format' are trademarks (tm) of Compuserve
  130. Incorporated, an H&R Block Company.
  131.  
  132.  
  133. The following routines perform the GIF encoding when the 's' key is pressed.
  134. The routines refer to several variables that are declared elsewhere
  135. [colors, xdots, ydots, and 'dacbox'], and rely on external routines to
  136. actually read and write screen pixels [getcolor(x,y) and putcolor(x,y,color)].
  137. (Writing pixels is just stuffed in here as a sort of visual status report,
  138. and has nothing to do with any GIF function.)    They also rely on the
  139. existence of an externally-defined 64K dataspace and they use the routines
  140. 'toextra()' and 'cmpextra()' to deal with that dataspace (in the same manner
  141. as 'memcpy()' and 'memcmp()' would).   Otherwise, they perform a generic
  142. GIF-encoder function.
  143.  
  144. Note that these routines use small string- and hash-tables, and "flush"
  145. the GIF entries whenever the hash-table gets two-thirds full or the string
  146. table gets full.   They also use the GIF encoding technique of limiting the
  147. encoded string length to a specific size, "adding" a string to the hash table
  148. at that point even if a matching string exists ("adding" is in quotes, because
  149. if a matching string exists we can increment the code counter but safely throw
  150. the duplicate string away, saving both string space and a hash table entry).
  151.  
  152.    This results in relatively good speed and small data space, but at the
  153. expense of compression efficiency (filesize).    These trade-offs could be
  154. adjusted by modifying the #DEFINEd variables below.
  155.  
  156. Note that the 'strlocn' and 'teststring' routines are declared
  157. to be external just so that they can be defined (and the space re-used)
  158. elsewhere.  The actual declarations are in the assembler code.
  159.  
  160. */
  161.  
  162. #define MAXTEST   100        /* maximum single string length */
  163. #define MAXSTRING 64000     /* total space reserved for strings */
  164.                 /* maximum number of strings available */
  165. #define MAXENTRY  5003        /* (a prime number is best for hashing) */
  166.  
  167. #ifndef XFRACT
  168. extern unsigned int strlocn[MAXENTRY];
  169. extern BYTE teststring[MAXTEST];
  170. extern BYTE block[266];   /* GIF-encoded blocks go here */
  171. #else
  172. unsigned int strlocn[MAXENTRY];
  173. BYTE teststring[MAXTEST];
  174. BYTE block[266];   /* GIF-encoded blocks go here */
  175. #endif
  176.  
  177. static int numsaves = 0;    /* For adjusting 'save-to-disk' filenames */
  178.  
  179. static FILE *out;
  180. static int last_colorbar;
  181. static int save16bit;
  182. static int outcolor1s, outcolor2s;
  183.  
  184. static int lentest, lastentry, numentries, numrealentries;
  185. static unsigned int nextentry;
  186. static int clearcode, endcode;
  187. static unsigned int hashcode;
  188.  
  189. static BYTE blockcount;
  190. static int startbits, codebits, bytecount, bitcount;
  191.  
  192. static char paletteBW[] = {            /* B&W palette */
  193.       0,  0,  0, 63, 63, 63,
  194.     };
  195. static char paletteCGA[] = {            /* 4-color (CGA) palette  */
  196.       0,  0,  0, 21, 63, 63, 63, 21, 63, 63, 63, 63,
  197.     };
  198. static char paletteEGA[] = {            /* 16-color (EGA/CGA) pal */
  199.       0,  0,  0,  0,  0, 42,  0, 42,  0,  0, 42, 42,
  200.      42,  0,  0, 42,  0, 42, 42, 21,  0, 42, 42, 42,
  201.      21, 21, 21, 21, 21, 63, 21, 63, 21, 21, 63, 63,
  202.      63, 21, 21, 63, 21, 63, 63, 63, 21, 63, 63, 63,
  203.     };
  204.  
  205. void encoder_overlay() { }    /* for restore_active_ovly */
  206.  
  207. int savetodisk(filename)    /* save-to-disk routine */
  208.    char *filename;
  209.    {
  210.    char tmpmsg[41]; /* before openfile in case of overrun */
  211.    char openfile[80], openfiletype[10];
  212.    char tmpfile[80];
  213.    int newfile;
  214.    int i, j, outcolor1, outcolor2, interrupted;
  215.  
  216.    ENTER_OVLY(OVLY_ENCODER);
  217.  
  218. restart:
  219.  
  220.    save16bit = disk16bit;
  221.    if (gif87a_flag) /* not storing non-standard fractal info */
  222.       save16bit = 0;
  223.  
  224.    strcpy(openfile,filename);        /* decode and open the filename */
  225.    strcpy(openfiletype,DEFAULTFRACTALTYPE);/* determine the file extension */
  226.    if (save16bit)
  227.       strcpy(openfiletype,".pot");
  228.    for (i = 0; i < strlen(openfile); i++)
  229.       if (openfile[i] == '.') {
  230.          strcpy(openfiletype,&openfile[i]);
  231.          openfile[i] = 0;
  232.          }
  233.    if (resave_flag !